package com.lzy.pattern.template;

/**
 * @ClassName: Cook
 * @Description: TODO
 * @Author: LiuZy
 * @Date: 2022/4/27 09:58
 * @Version: 1.0
 */
public abstract class Cook {

    /**
     * 模板方法,模板方法可以做成final , 不让子类去覆盖.
     */
    public final void cookProcess(){
        //第一步：倒油
        this.pourOil();
        //第二步：热油，这一步可选：有的菜冷油就可以炒
        if(isHeatOil()){
            this.heatOil();
        }
        //第三步：倒蔬菜
        this.pourVegetable();
        //第四步：倒调味料
        this.pourSauce();
        //第五步：翻炒
        this.fry();
    }

    void pourOil(){
        System.out.println("倒油");
    }
    void heatOil(){
        System.out.println("热油");
    }

    /**
     * 放不同素菜
     */
    abstract void pourVegetable();

    /**
     * 放不同调味料
     */
    abstract void pourSauce();
    void fry(){
        System.out.println("翻炒起锅");
    }

    /**
     * 钩子函数，是否热油
     * 我们可以定义一个方法，它默认不做任何事，子类可以视情况要不要覆盖它，该方法称为“钩子”。（钩子方法，有子类实现子类，没有实现自己默认的）
     * @return
     */
    Boolean isHeatOil(){
        return true;
    }
}